0

我需要一些帮助。我正在尝试使 EF Query 的一部分可重用。

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。

4

2 回答 2

0

扩展方法似乎很适合这个。我不知道你在做什么所以这是一个例子

客户类

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);
   }
}

客户扩展方法

//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());

这应该打印“客户是麦当劳叔叔”。对重要部分进行了注释。包含方法的类应该是静态的,方法也需要是静态的。除此之外,该方法的第一个参数需要this表明它是一个扩展方法。这将允许您在为第一个参数放置的特定类型上调用它。

于 2013-05-17T20:37:01.710 回答
0

为我的烦恼找到了一个很好的答案和文章。

http://www.codeproject.com/Articles/402594/Black-Art-LINQ-expressions-reuse

一个不错的 NuGet 包 LinqExpressionProjection 1.0.0,非常适合我的问题。

http://nuget.org/packages/LinqExpressionProjection

于 2013-05-23T20:27:01.303 回答