Select语句如何在动态Linq查询中起作用?

时间:2010-04-01 03:30:27

标签: asp.net-mvc linq-to-sql

1)我有一个包含4列的产品表:ProductID,Name,Category和Price。这是查询此表的常规linq。

public ActionResult Index()
{
  private ProductDataContext db = new ProductDataContext();
  var products = from p in db.Products
                 where p.Category == "Soccer"
                 select new ProductInfo { Name = p.Name, Price = p.Price}
  return View(products);
}

其中ProductInfo只是一个包含2个属性(名称和价格)的类。索引页面继承 ViewPage - IEnumerable - ProductInfo 。一切正常。

2)为了动态地执行上述查询,我​​这样做:

Public ActionResult Index()
{
  var products =
                 db.Products
                 .Where("Category = \"Soccer\"")
                 .Select(/* WHAT SOULD I WRITE HERE TO SELECT NAME & PRICE?*/)
  return View(products);
}

我正在使用'System.Lind.Dynamic'命名空间和DynamicLibrary.cs(从ScottGu博客下载)。

以下是我的问题:

  1. 我使用什么表达式来选择名称和价格?
  2. (最重要的是)如何在视图中检索数据? (即ViewPage继承的类型是什么?ProductInfo?)
  3. =================== 修改

    1. 当我写.Select(“new(Name,Price)”)时,我能够将一个对象传递给ViewData的Model属性。不幸的是,为了使用Viewdata对象,我被要求将Viewdata转换为类型。但是,我不知道如何确定进行铸造的类型。
    2. ==================== 修改

      而不是ViewData的Model属性,我只使用ViewData [“products”]。要检索内容,我只需在ViewData之前放置IEnumerable转换,如下所示:

      <% foreach(var item in (IEnumerable)ViewData["products"]){%>
         <p><% = Html.Encode(item)%><p>
      <%}%>
      

      有两种情况:

      1)如果我只选择一列(例如,名称),一切正常。 2)如果我选择多于1列(名称,价格),我会得到类似的内容

      {Name=Soccer, Price=19.50}
      {Name=Shin Pads, Price=11.59}
      

      为什么我没有得到像

      这样的东西
      Soccer, 19.50
      Shin Pads, 11.59
      

      ================================= 编辑4月02日 - 05:47 AM

      我将GetPropertyValue方法(作为您的响应建议)定义为静态类中的静态,我称之为“ HelperClass ”。现在,这是我尝试从我的对象访问Name的值的方式。

      <% = Html.Encode(HelperClass.GetPropertyValue(ViewData["product"], "Name")) %>
      

      我得到以下异常:“对象引用未设置为对象的实例”。而且,GetPropertyValue()内部的以下行是他的亮点。

      Line 22: return propInfo.GetValue(obj, null);
      

      我是否需要使用关键字? (λ)

      感谢您的帮助

2 个答案:

答案 0 :(得分:2)

Private Sub filter()

    Dim coll = db.Products.Where(Function(x) x.Category.Equals("Soccer")) _
                          .Select(Function(x) GetObject(x.Name, x.Price))

End Sub

Private Function GetObject(ByVal name As String, ByVal price As String) As Object
    Return new ProductInfo(name, price)
End Function

答案 1 :(得分:1)

1)要在运行时生成新的投影类型,您可以:

.Select("new(Name, Price)")

2)要从对象中读取值,您需要使用反射:

string name = GetPropertyValue(someObject, "Name");

...

public static object GetPropertyValue(object obj, string propName)
{
    System.Reflection.PropertyInfo propInfo = obj.GetType().GetProperty(propName);
    return propInfo.GetValue(obj, null);
}