我需要一些帮助。我正在尝试使EF查询的一部分可重用。
var query = from sr in SomeEFRepository.SelectAll()
select new {
KeyValuePivotField1 = (from kvd in sr.KeyValueData
where kvd.KeyName == "FieldName1"
select kvd.Value).FirstOrDefault(),
KeyValuePivotField2 = (from kvd in sr.KeyValueData
where kvd.KeyName == "FieldName2"
select kvd.Value).FirstOrDefault(),
KeyValuePivotField3 = (from kvd in sr.KeyValueData
where kvd.KeyName == "FieldName3"
select kvd.Value).FirstOrDefault()
}如果你看一下,你会发现我一直在用下面的代码重复我自己。
(from kvd in sr.KeyValueData
where kvd.KeyName == "SomeFieldName"
select kvd.Value).FirstOrDefault(),为了做这样的事情,我如何创建一个EF能够识别的方法?
var query = from sr in SomeEFRepository.SelectAll()
select new {
KeyValuePivotField1 = GetFieldFromKeyValue("FieldName1"),
KeyValuePivotField2 = GetFieldFromKeyValue("FieldName2"),
KeyValuePivotField3 = GetFieldFromKeyValue("FieldName3"),
}任何建议都会有所帮助。我一直在读表达式树,但我不确定这是不是一个好的方法,或者甚至是可能的。
注意:我使用的是带有DBContext的EF 5.0。
发布于 2013-05-24 04:27:01
我找到了一个很好的答案和文章来解决我的问题。
http://www.codeproject.com/Articles/402594/Black-Art-LINQ-expressions-reuse
一个很好的NuGet包LinqExpressionProjection 1.0.0,非常适合解决我的问题。
http://nuget.org/packages/LinqExpressionProjection
发布于 2013-05-18 04:37:02
扩展方法似乎很适合这一点。我不知道你到底在做什么,所以这是一个例子
客户类
public class Customer{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public override string ToString()
{
return string.Format("Customer is {0} {1}", this.FirstName, this.LastName);
}
}CustomerExtensionMethod
//Class MUST be static
public static class CustomerExtensionMethods
{
//Method MUST be static and use this keyword to be an extension method
public static Customer GetByFirstName(this IEnumerable<Customer> source, string value)
{
return source.Where(c => c.FirstName == value).FirstOrDefault();
}
}显示其工作原理的主程序
var customers = new List<Customer>
{
new Customer { Id = 1, FirstName = "Foo", LastName = "Bar" },
new Customer { Id = 2, FirstName = "Mark", LastName = "Whoknows" },
new Customer { Id = 3, FirstName = "Ronald", LastName = "McDonald" },
};
var userWithFirstNameOfRonald = customers.GetByFirstName("Ronald");
Console.WriteLine(userWithFirstNameOfRonald.ToString());这应该打印"Customer Is Ronald McDonald“。对其中的重要部分进行了评述。包含该方法的类应该是静态的,并且该方法需要是静态的。除此之外,该方法的第一个参数需要为this,以表明它是一个扩展方法。这将允许您在为第一个参数设置的特定类型上调用它。
https://stackoverflow.com/questions/16612618
复制相似问题