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博客下载)。
以下是我的问题:
=================== 修改
==================== 修改
而不是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);
我是否需要使用新关键字? (λ)
感谢您的帮助
答案 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);
}