Как оператор Select работает в динамическом запросе Linq? - PullRequest
1 голос
/ 01 апреля 2010

1) У меня есть таблица Product с 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?)

=================== EDIT

  1. Когда я пишу .Select ("new (Name, Price)"), я могу передать объект в свойство Model ViewData. К сожалению, чтобы использовать объект Viewdata, меня попросили привести Viewdata к типу. Но я не знаю, как определить тип для кастинга.

==================== EDIT

Вместо свойства Model в ViewData я использую просто ViewData ["products"]. Чтобы извлечь содержимое, я просто помещаю приведенный выше объект IEnumerable, например:

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

Есть 2 ситуации:

1) Если я выберу только один столбец (например, Имя), все будет работать нормально. 2) Если я выберу больше 1 столбца (Имя, Цена), я получу что-то вроде этого

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

Почему я просто не понимаю что-то вроде

Soccer, 19.50
Shin Pads, 11.59

================================= РЕДАКТИРОВАТЬ 02 апреля - 05:47 AM

Я определил метод GetPropertyValue (как ваши ответные предложения) как статический в статическом классе, который я назвал ' HelperClass '. Теперь я пытаюсь получить доступ к значению Name из моего объекта.

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

Я получаю следующее исключение: «Ссылка на объект не установлена ​​на экземпляр объекта». И следующая строка изнутри GetPropertyValue () его подсветка.

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

Нужно ли использовать новое ключевое слово? (Где?)

Спасибо за помощь

Ответы [ 2 ]

2 голосов
/ 13 октября 2011
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 голос
/ 01 апреля 2010

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...