का उपयोग करके इकाई फ्रेमवर्क के साथ एकाधिक रिकॉर्ड हटाना मैं LINQ का उपयोग करके एक डेलेटी करने की कोशिश कर रहा हूं जो एक क्वेरी उत्पन्न करेगा।एक एकल LINQ क्वेरी
यहाँ कैसे मैं इसे कर रहा हूँ है:
// NorthwintEntities is an ADO.NET Entitity Data Model
var northwindEntities = new NorthwindEntities();
northwindEntities.Order_Details.Delete(o => o.Order_ID == 11076);
यहाँ मेरी एक्सटेंशन है:
public static class EntityExtensions
{
private static Regex rxTableName = new Regex(@"^FROM\s+(?<table>\[[^\]]*\](\.\[[^\]]*\]){0,2})\s+AS\s+(?<alias>\[[^\]]*\])", RegexOptions.Multiline);
public static void Delete<T>(this ObjectSet<T> entity, Expression<Func<T, bool>> expression) where T : EntityObject
{
var selectQuery = entity.Where(expression).Select(x => 1);
string selectQueryString = ((ObjectQuery)selectQuery).ToTraceString();
string deleteQueryString = ConvertSqlSelectToDelete(selectQueryString);
entity.Context.ExecuteStoreCommand(deleteQueryString);
}
private static string ConvertSqlSelectToDelete(string selectQuery)
{
if (selectQuery.IndexOf(" JOIN ") > -1)
{
throw new Exception("Query with JOIN is not supported: " + selectQuery);
}
Match match = rxTableName.Match(selectQuery);
if (!match.Success)
{
throw new Exception("Unable to convert SELECT: " + selectQuery);
}
string deleteQuery = "DELETE \r\n" + selectQuery.Substring(match.Index);
deleteQuery = deleteQuery.Replace(match.Groups["alias"].Value + ".", "");
deleteQuery = deleteQuery.Replace("AS " + match.Groups["alias"].Value, "");
return deleteQuery;
}
}
यह काम करता है, लेकिन मैं कुछ टिप्पणी है।
- मैं रेगेक्स का उपयोग करने का एक बड़ा प्रशंसक नहीं हूं, लेकिन यह टेबल नाम पाने का एकमात्र तरीका था। (entity.EntitySet.Name हमेशा सही नाम नहीं लौटाएगा। [ऑर्डर विवरण] एक उदाहरण है)।
- इसे पूरा करने के बाद, मुझे यह http://msmvps.com/blogs/matthieu/archive/2010/05/21/bulk-delete-v3.aspx मिला लेकिन यह वैसे भी काम नहीं कर सका। संदर्भ से एक अप्रतिबंधित अपवाद प्राप्त करने के लिए हटा दिया गया है।
- जॉइन के साथ हटाएं काम नहीं लग रहा है। मैं SQL सर्वर कॉम्पैक्ट 3.5 के साथ परीक्षण कर रहा हूं, शायद यह उस की एक सीमा है।
तो मेरे प्रश्न हैं: क्या ऐसा करने का कोई आसान तरीका है? यदि ऐसा है, तो ये क्या है?
किसी भी मदद बिल्कुल सराहना की जाएगी।
के साथ ऑर्डर के अंदर सभी रिकॉर्ड कृपया [प्रश्न] [1] पर एक नज़र डालें। [1]: http://stackoverflow.com/questions/8538899/ –
क्या आपने EF6 में RemoveRange माना है? मैं जानना चाहता हूं कि यह "अनुकूलित" कितना है और यह किस प्रकार चलता है। http://msdn.microsoft.com/en-us/library/system.data.entity.dbset.removerange(v=vs.113).aspx – Colin
मेटाडेटा से तालिका का नाम प्राप्त करना - http://stackoverflow.com/a/18 9 64 9 74/150342 – Colin