Выбор объекта недвижимости по названию в проекции Linq - PullRequest
0 голосов
/ 04 августа 2010

У меня есть класс сказать

public class CostStore
{
    int DirectorateId { get; set; }

    decimal NewCar { get; set; }

    decimal ContractorNew { get; set; }

    decimal ContractorRenew { get; set; }

    decimal ContractorLost { get; set; }

    decimal ContractorStolen { get; set; }

    decimal InternalNew { get; set; }

    decimal InternalRenew { get; set; }

    decimal InternalLost { get; set; }

    decimal InternalStolen { get; set; }        
}

и в моем контроллере я хочу узнать, скажем

var c = from p in _service.List().Where (condition) p.InternalNew/InternalRenew

(и т. Д.) Свойство, основанное на переменной сеанса, как в приведенной ниже функции, как я могу сделать это в операторе linq ... любые идеи (_service.List () перечисляют IEnumerable класса CostStore

private string FindProperty()
{
    switch (Session[Constants.FORMSESSIONKEY].ToString())
    {
        case Constants.NEWAPP:
            return "InternalNew";
        case Constants.LOST:
            return "InternalLost";
        case Constants.NEWCAR:
            return "NewCar";
        case Constants.OTHER:
            return "InternalStolen";
        case Constants.RENEW:
            return "InternalRenew";
        default:
            return String.Empty;  
     }
}

В настоящее время я должен сделать это

private Decimal FindProperty()
{
    switch (Session[Constants.FORMSESSIONKEY].ToString())
    {
        case Constants.NEWAPP:
            return (from p in _costStoreService.List().Where(p => p.DirectorateId == _applicant.DirectorateId)
                    select p.InternalNew).Single() ?? 0.0M;
        case Constants.LOST:
            return (from p in _costStoreService.List().Where(p => p.DirectorateId == _applicant.DirectorateId)
                    select p.InternalLost).Single();
        case Constants.NEWCAR:
            return (from p in _costStoreService.List().Where(p => p.DirectorateId == _applicant.DirectorateId)
                    select p.NewCar).Single();
        case Constants.OTHER:
            return (from p in _costStoreService.List().Where(p => p.DirectorateId == _applicant.DirectorateId)
                    select p.InternalStolen).Single();
        case Constants.RENEW:
            return (from p in _costStoreService.List().Where(p => p.DirectorateId == _applicant.DirectorateId)
                    select p.InternalRenew).Single();
        default:
            return 0.0M;
        }
    }

но много повторяющегося кода, также нет проверки последовательности, содержащей 0 значений ...

1 Ответ

1 голос
/ 04 августа 2010

Я предполагаю, что ваш сервис вернется IQueryable<T>. Вы можете использовать выражение для определения проекции вне вашего запроса:

    private Expression<Func<CostStore,Decimal>> GetProjection()
    {
        switch (Session[Constants.FORMSESSIONKEY].ToString())
        {
            case Constants.NEWAPP: 
                return c => c.InternalNew;
            case Constants.LOST:
                return c=> c.InternalLost;
            // ... etc, you get the idea
            default:
                return c => 0m; // or some other sensible default
               // break;
        }
    }

Если ваш сервис возвращает IEnumerable<T>, используйте Func<CostStore,decimal>.

Вы можете использовать это так:

var projection = GetProjection();
var c = _service.List().Where (condition).Select(projection) 

РЕДАКТИРОВАТЬ: положить это в консольное приложение, учиться и учиться.

using System;
using System.Collections.Generic;
using System.Linq;

namespace ConsoleApplication13
{
class Program
{
    static void Main(string[] args)
    {
        var _service = new Service();

        Func<CostStore, bool> condition = s => s.DirectorateId == 10;
        Func<CostStore, decimal> projection = GetProjection();

        var c = _service.List().Where(condition).Select(projection);
    }

    private static Func<CostStore, decimal> GetProjection()
    {
        return c => c.NewCar;
    }

    class Service
    {
        public IEnumerable<CostStore> List()
        {
            return new List<CostStore>();
        }
    }

    public class CostStore
    {
        public int DirectorateId { get; set; }
        public decimal NewCar { get; set; }
    }
}
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...