Объединить выражение выбора - PullRequest
1 голос
/ 15 октября 2011

Я хотел бы реализовать нечто очень похожее на это Объединить несколько похожих SELECT-выражений в одно выражение , однако код не работает для моего случая.

Я хотел бы передать 2 keySelectors (свойства) и хотел бы объединить их для запроса выбора EF 4.1.

В качестве примера см. Код ниже:

public class Category
{
    public int CategoryId { get; set; }
    [Required(ErrorMessage = "Name required.")]
    [StringLength(25, ErrorMessage = "Must be less than 25 characters.")]
    public string Name { get; set; }
    public string Description { get; set; }
    public DateTime? CreateDateTime { get; set; }
}

public class SampleContext : DbContext
{
    public SampleContext() : base("Sketch7.Sample") { }

    public DbSet<Category> Categories { get; set; }
}

public static class Repository
{

    public Dictionary<TKey, TKeyValue> GetKeyValue<TKey, TKeyValue>(Expression<Func<TEntity, TKey>> keySelector, Expression<Func<TEntity, TKeyValue>> valueKeySelector)
    {
        var combined = //ToDo Select Combine here...

        SampleContext db = new SampleContext(); 
        var result = db.Categories.Select(combined);
        ...
        return dictionary;
    }
}

использование

public void GetKeyValueTest()
{
    Repository.GetKeyValue(x => x.Id , x => x.Name);
}

Может кто-нибудь помочь мне, пожалуйста!

Ответы [ 2 ]

0 голосов
/ 21 октября 2011

Я изменил реализацию и вместо комбинирования выбранных выражений я сделал это таким образом. Это немного другой сценарий, но я надеюсь, что вы поймете идею.

public class KeyValue<TKey, TValue>
{
    public TKey Key { get; set; }
    public TValue Value { get; set; }
}

public Dictionary<TKey, TValue> GetKeyValue<TKey, TValue>(Expression<Func<TEntity, KeyValue<TKey, TValue>>> keySelector)
{
    return _dbset.Select(keySelector).ToDictionary(x => x.Key, x => x.Value);
}

public Dictionary<int, string>  GetIndustriesKeyValue()
{
    return IndustryRepository.GetKeyValue(x => new KeyValue<int, string> {Key = x.Id, Value = x.Name});
}
0 голосов
/ 16 октября 2011

Вы можете сделать это:

public Dictionary<TKey, TKeyValue> GetKeyValue<TKey, TKeyValue>
    (Func<Category, TKey> keySelector, 
     Func<Category, TKeyValue> valueKeySelector)
{
    var combined = //ToDo Select Combine here...

    SampleContext db = new SampleContext(); 
    var result = db.Categories.Select(combined);
    ...
    return result.ToDictionary(keySelector, valueSelector);
}

Примечания:

  1. TEntity необходимо передать или быть конкретным
  2. ToDictionary не принимает выражениятолько делегаты.
...